// /**
//  * @file PlannerBase.h
//  * @brief 路径规划器基类
//  * @details 定义所有路径规划算法的统一接口和公共功能
//  */

// #ifndef PLANNER_BASE_H
// #define PLANNER_BASE_H

// #include "core/Types.h"
// #include "core/Map.h"
// #include <memory>
// #include <functional>
// #include <iostream>

// namespace PathPlanning
// {
// class PlannerBase
// {
// public:
//     PlannerBase(std::shared_ptr<Map> map);
//     virtual ~PlannerBase() = default;

//     /**
//      * @brief 执行路径规划
//      * @param start 起始点
//      * @param goal 目标点
//      * @return 规划结果
//      */
//     virtual PlanningResult plan(const Point& start, const Point& goal) = 0;

//     /**
//      * @brief 设置配置参数
//      */
//     virtual void setConfig(std::shared_ptr<PlannerConfig> config)
//     {
//         config_ = config;
//     }

//     /**
//      * @brief 获取配置参数
//      */
//     std::shared_ptr<PlannerConfig> getConfig() const
//     {
//         return config_;
//     }

//     /**
//      * @brief 设置可视化回调函数
//      */
//     void setVisualizationCallback(std::function<void(const PlanningResult&)> callback)
//     {
//         vizCallback_ = callback;
//     }

//     /**
//      * @brief 加载配置文件
//      */
//     virtual bool loadConfig(const std::string& configFile);

//     /**
//      * @brief 平滑路径
//      */
//     virtual std::vector<Pose> smoothPath(const std::vector<Pose>& path);

// protected:
//     std::shared_ptr<Map>                       map_;
//     std::shared_ptr<PlannerConfig>             config_;
//     std::function<void(const PlanningResult&)> vizCallback_;

//     /**
//      * @brief 检查起点和终点是否有效
//      */
//     virtual bool validateStartGoal(const Point& start, const Point& goal);

//     /**
//      * @brief 计算两点间的欧几里得距离
//      */
//     double euclideanDistance(const Point& a, const Point& b) const;

//     /**
//      * @brief 计算两点间的曼哈顿距离
//      */
//     double manhattanDistance(const Point& a, const Point& b) const;

//     /**
//      * @brief 获取邻居节点 (8方向或4方向)
//      */
//     virtual std::vector<GridCell> getNeighbors(const GridCell& cell, bool eightConnected = true);
// };

// } // namespace PathPlanning

// #endif

/**
 * @file PlannerBase.h
 * @brief 路径规划器基类 - 修复可视化回调
 */

#ifndef PLANNER_BASE_H
#define PLANNER_BASE_H

#include "Types.h"
#include "Map.h"
#include <memory>
#include <functional>
#include <iostream>

namespace PathPlanning
{
class PlannerBase
{
public:
    PlannerBase(std::shared_ptr<Map> map);
    virtual ~PlannerBase() = default;

    /**
     * @brief 执行路径规划
     */
    virtual PlanningResult plan(const Point& start, const Point& goal) = 0;

    /**
     * @brief 设置配置参数
     */
    virtual void setConfig(std::shared_ptr<PlannerConfig> config)
    {
        config_ = config;
    }

    /**
     * @brief 获取配置参数
     */
    std::shared_ptr<PlannerConfig> getConfig() const
    {
        return config_;
    }

    /**
     * @brief 设置可视化回调函数
     */
    void setVisualizationCallback(std::function<void(const PlanningResult&)> callback)
    {
        vizCallback_ = callback;
        std::cout << "Visualization callback set for planner" << std::endl;
    }

    /**
     * @brief 调用可视化回调（子类应该在搜索过程中调用这个）
     */
    void callVisualizationCallback(const PlanningResult& result)
    {
        if (vizCallback_)
        {
            vizCallback_(result);
        }
    }

    /**
     * @brief 检查是否有可视化回调
     */
    bool hasVisualizationCallback() const
    {
        return static_cast<bool>(vizCallback_);
    }

    /**
     * @brief 加载配置文件
     */
    virtual bool loadConfig(const std::string& configFile);

    /**
     * @brief 平滑路径
     */
    virtual std::vector<Pose> smoothPath(const std::vector<Pose>& path);

protected:
    std::shared_ptr<Map>                       map_;
    std::shared_ptr<PlannerConfig>             config_;
    std::function<void(const PlanningResult&)> vizCallback_;

    /**
     * @brief 检查起点和终点是否有效
     */
    virtual bool validateStartGoal(const Point& start, const Point& goal);

    /**
     * @brief 计算两点间的欧几里得距离
     */
    double euclideanDistance(const Point& a, const Point& b) const;

    /**
     * @brief 计算两点间的曼哈顿距离
     */
    double manhattanDistance(const Point& a, const Point& b) const;

    /**
     * @brief 获取邻居节点 (8方向或4方向)
     */
    virtual std::vector<GridCell> getNeighbors(const GridCell& cell, bool eightConnected = true);
};

} // namespace PathPlanning

#endif